package com.hex.liyue.launchdatemodule.activity;

import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.hex.liyue.R;
import com.hex.liyue.commonmodule.activity.BaseActivity;
import com.hex.liyue.commonmodule.utils.L;
import com.hex.liyue.commonmodule.utils.StatusBarCompatUtils;
import com.hex.liyue.commonmodule.view.recycleview.YRecycleview;
import com.hex.liyue.launchdatemodule.adapter.AdapterLocation;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import butterknife.Bind;
import butterknife.OnClick;

/**
 * Created by WJ on 2016/7/1.
 * 地址列表的界面¬
 */
public class LocationActivity extends BaseActivity implements AMapLocationListener, PoiSearch.OnPoiSearchListener, YRecycleview.RefreshAndLoadMoreListener, AdapterLocation.OnItemClickListener {
    @Bind(R.id.rv_location_list)
    YRecycleview rvLocationList;
    @Bind(R.id.iv_toobar_back)
    ImageView ivToobarBack;
    @Bind(R.id.tv_toobar_title)
    TextView tvToobarTitle;
    @Bind(R.id.et_search)
    EditText etSearch;

    private String keyWord = "" ;//关键字
    private String cityCode = "" ;//城市code
    private int currentPage = 1;//当前页
    private int WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 201;
    private int READ_PHONE_STATE_REQUEST_CODE = 205;
    private int ACCESS_FINE_LOCATION_REQUEST_CODE = 206;
    private int ACCESS_COARSE_LOCATION_REQUEST_CODE = 207;

    //声明mLocationOption对象
    public AMapLocationClientOption mLocationOption = null;
    public AMapLocationClient mlocationClient = null;
    public PoiSearch.Query query;
    public AMapLocation aMapLocation;
    private AdapterLocation adapterLocation;
    private List<PoiItem> list = new ArrayList<>();
    private String tvLocation;
    private TextWatcher textWatcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            //更改了
            L.d("WJ", "更改了==");
            //搜索地址
            currentPage = 1;
            list.clear();
            keyWord = etSearch.getText().toString();
            searchKeyWord();

        }
    };

    @Override
    protected void bindPresenter() {

    }

    @Override
    protected void initData(Bundle extras) {
        etSearch.addTextChangedListener(textWatcher);
        tvLocation = getIntent().getStringExtra("tvLocation");
        if (tvLocation != "") {
            etSearch.setText(tvLocation);
        }
        adapterLocation = new AdapterLocation();
        adapterLocation.setOnItemClickListener(this);
        rvLocationList.setLayoutManager(new LinearLayoutManager(this));
        rvLocationList.setAdapter(adapterLocation);
        rvLocationList.setReFreshEnabled(false);
        rvLocationList.setLoadMoreEnabled(true);
        rvLocationList.setRefreshAndLoadMoreListener(this);

        //取消处理自己的逻辑
        mlocationClient = new AMapLocationClient(this);
        //初始化定位参数
        mLocationOption = new AMapLocationClientOption();
        //设置定位模式为高精度模式，Battery_Saving为低功耗模式，Device_Sensors是仅设备模式
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        //设置定位间隔,单位毫秒,默认为2000ms
        mLocationOption.setInterval(2000);

        //设置定位监听
        mlocationClient.setLocationListener(this);
        //设置定位参数
        mlocationClient.setLocationOption(mLocationOption);
        // 此方法为每隔固定时间会发起一次定位请求，为了减少电量消耗或网络流量消耗，
        // 注意设置合适的定位时间的间隔（最小间隔支持为2000ms），并且在合适时间调用stopLocation()方法来取消定位请求
        // 在定位结束后，在合适的生命周期调用onDestroy()方法
        // 在单次定位情况下，定位无论成功与否，都无需调用stopLocation()方法移除请求，定位sdk内部会移除
        // 启动定位
        showLoad(this, "加载中...");
        mlocationClient.startLocation();

    }

    @Override
    public int getContentLayout() {
        return R.layout.activity_location;
    }

    @Override
    protected void initToolbar() {
        StatusBarCompatUtils.compat(this);
        ivToobarBack.setVisibility(View.VISIBLE);
        tvToobarTitle.setText("我的位置");
    }

    @Override
    public void onLocationChanged(AMapLocation aMapLocation) {
        if (aMapLocation.getErrorCode() == 0) {
            //定位成功回调信息，设置相关消息
            this.aMapLocation = aMapLocation;
            L.d("WJ", "获取当前定位结果来源，如网络定位结果，详见定位类型表=" + aMapLocation.getLocationType());//获取当前定位结果来源，如网络定位结果，详见定位类型表
            L.d("WJ", "获取纬度=" + aMapLocation.getLatitude());//获取纬度
            L.d("WJ", "获取经度=" + aMapLocation.getLongitude());//获取经度
            L.d("WJ", "获取精度信息=" + aMapLocation.getAccuracy());//获取精度信息
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date(aMapLocation.getTime());
            L.d("WJ", "定位时间" + df.format(date));//定位时间
            L.d("WJ", "城市=" + aMapLocation.getCity() + ":" + aMapLocation.getCityCode());
            cityCode = aMapLocation.getCityCode();
            searchNedar();
        } else {
            //显示错误信息ErrCode是错误码，errInfo是错误信息，详见错误码表。
            L.e("AmapError", "location Error, ErrCode:"
                    + aMapLocation.getErrorCode() + ", errInfo:"
                    + aMapLocation.getErrorInfo());
        }
        mlocationClient.stopLocation();//结束定位
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mlocationClient == null) {
            return;
        }
        mlocationClient.stopLocation();
    }

    @Override
    public void onPoiSearched(PoiResult poiResult, int i) {
        closeLoad();
        //可以在回调中解析result，获取POI信息
        //result.getPois()可以获取到PoiItem列表，Poi详细信息可参考PoiItem类
        //若当前城市查询不到所需Poi信息，可以通过result.getSearchSuggestionCitys()获取当前Poi搜索的建议城市
        //如果搜索关键字明显为误输入，则可通过result.getSearchSuggestionKeywords()方法得到搜索关键词建议
        //返回结果成功或者失败的响应码。1000为成功，其他为失败（详细信息参见网站开发指南-错误码对照表）
        L.d("WJ", i + "onPoiSearched=" + poiResult);
        if (i == 1000) {
            //成功
            list.addAll(poiResult.getPois());
            adapterLocation.setList(list);
            adapterLocation.notifyDataSetChanged();
        } else {
            //失败
            L.d("WJ", "返回结果失败");
        }
        rvLocationList.reSetStatus();
    }

    @Override
    public void onPoiItemSearched(PoiItem poiItem, int i) {
        L.d("WJ", i + "onPoiItemSearched=" + poiItem);
    }

    /**
     * 关键字搜索
     */
    private void searchKeyWord() {
        query = new PoiSearch.Query(keyWord, "", cityCode);
        // keyWord表示搜索字符串，
        //第二个参数表示POI搜索类型，二者选填其一，
        //POI搜索类型共分为以下20种：汽车服务|汽车销售|
        //汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|
        //住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|
        //金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施
        //cityCode表示POI搜索区域的编码，是必须设置参数
        query.setPageSize(10);// 设置每页最多返回多少条poiitem
        query.setPageNum(currentPage);//设置查询页码
        PoiSearch poiSearch = new PoiSearch(this, query);//初始化poiSearch对象
        poiSearch.setOnPoiSearchListener(this);//设置回调数据的监听器
        poiSearch.searchPOIAsyn();//开始搜索
    }

    /**
     * 搜索周边
     */
    private void searchNedar() {
        query = new PoiSearch.Query(keyWord, "", cityCode);
        // keyWord表示搜索字符串，第二个参数表示POI搜索类型，默认为：生活服务、餐饮服务、商务住宅
        //共分为以下20种：汽车服务|汽车销售|
        //汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|
        //住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|
        //金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施
        //cityCode表示POI搜索区域，（这里可以传空字符串，空字符串代表全国在全国范围内进行搜索）
        query.setPageSize(10);// 设置每页最多返回多少条poiitem
        query.setPageNum(currentPage);//设置查第一页
        PoiSearch poiSearch = new PoiSearch(this, query);
        poiSearch.setBound(new PoiSearch.SearchBound(new LatLonPoint(aMapLocation.getLatitude(), aMapLocation.getLongitude()), 1000));//设置周边搜索的中心点以及区域
        poiSearch.setOnPoiSearchListener(this);//设置数据返回的监听器
        poiSearch.searchPOIAsyn();//开始搜索
    }

    @Override
    public void onRefresh() {

    }

    @Override
    public void onLoadMore() {
        currentPage++;
        searchNedar();
    }


    @Override
    public void onItemClickListener(int id, String latitude, String longitude) {
        //行点击
        LaunchDateActivity.location = list.get(id).getTitle();
        LaunchDateActivity.latitude = latitude;
        LaunchDateActivity.longitude = longitude;
        setResult(RESULT_OK);
        finish();
    }


    @OnClick(R.id.iv_toobar_back)
    public void onClick(View v) {
        if (v.getId() == R.id.iv_toobar_back) {
            onBackPressed();
        }
    }
}
